<?php

/* It is not allowed to create an instance of a class that has been defined as abstract.
 * Any class that contains at least one abstract method must also be abstract. Methods defined
 * as abstract simply declare the method's signature they cannot define the implementation.
 */

  abstract class AbstractClass
  {
    // Force Extending class to define this method
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // Common method
    public function printOut() {
      print $this->getValue() . "<br/>";
    }
  }

  class ConcreteClass1 extends AbstractClass
  {
    protected function getValue1() {
      return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
      return "{$prefix}ConcreteClass1";
    }
  }

  class ConcreteClass2 extends AbstractClass
  {

    public function getValue() {
      return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
      return "{$prefix}ConcreteClass2";
    }
  }

  $class1 = new ConcreteClass1;
  $class1->printOut();
  echo $class1->prefixValue('FOO_') ."\n";

  $class2 = new ConcreteClass2;
  $class2->printOut();
  echo $class2->prefixValue('FOO_') ."\n";

